/*
 * Semaphore.h
 *
 *  Created on: 2011/06/04
 *      Author: naoki
 */

#ifndef INCLUDED_NTENGINE_THREADING_SEMAPHORE_H
#define INCLUDED_NTENGINE_THREADING_SEMAPHORE_H

namespace NTEngine {
namespace Threading {

/**
 * @brief セマフォ
 */
class Semaphore {
public:
	/**
	 * @brief インスタンスを生成します
	 * @param startCount : 同時ロック数の初期値
	 * @param maxCount : 最大数。デフォルトではstartCountと同じ
	 */
	static Semaphore create( int startCount, int maxCount = 0 );

	/**
	 * @brief カウントを1減らそうとする。すでに0だと眠らされる。
	 *       実質lock
	 */
	void decrease();

	/**
	 * @brief カウントを増やす。引数を省略すれば1。
	 *       実質unlock
	 */
	void increase( int v = 1 );

	Semaphore();
	~Semaphore();
	Semaphore( const Semaphore& );
	Semaphore& operator=( const Semaphore& );
	operator void*() const;
	void release();
	bool operator==( const Semaphore& ) const;
	bool operator!=( const Semaphore& ) const;
	int referenceCount() const;
private:
	class Impl;
	Impl* mImpl;
};

} // namespace Threading
} // namespace NTEngine

#endif // INCLUDED_NTENGINE_THREADING_SEMAPHORE_H
